package j16;

public class J16_Calculrator {

	public static void main(String[] args) {
		//상속, 인터페이스, 기본클래스를 이용해서
		//사칙연산을 수행하는 계산기 프로그램 작성
		
		J16Add add = new J16Add();
		add.setValues(3, 7);
		System.out.println(add.toString());
		System.out.println(add.calculate());
	
		J16Mul mul = new J16Mul();
		mul.setValues(78, 14);
		System.out.println(mul.toString());
		System.out.println(mul.calculate());
	
		J16Sub sub = new J16Sub();
		sub.setValues(50, 47);
		System.out.println(sub.toString());
		System.out.println(sub.calculate());
		
		J16Div div = new J16Div();
		div.setValues(9, 3);
		System.out.println(div.toString());
		System.out.println(div.calculate());
		
		//+, * 사칙연산을 위해
		//J16Add, J16Mul 객체를 생성하였음
		//하지만 -, / 연산을 위해
		// J16Sub, J16Div 객체도 생성해야함
		//사칙연산을 위해 불필요한 객체를 
		//마구 생성하는 낭비가 발생
		//해결책 - 상위 자료형 변환 업캐스팅(upcasting)을 이용
		
		J16Cal c = new J16Add();
		c.setValues(10, 100);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		
		c = new J16Mul();
		c.setValues(150, 47);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		
		//+, * 연산을 위해 J16Add, J16Mul의
		//부모인 J16Cal 객체만 생성
		//추후 -, / 연산을 위해
		//J16Sub, J16Div 객체를 생성하더라도
		//부모인  J16Cal 객체만 가져다 쓰면 된다.
		
	}//main

}//class


//인터페이스
interface J16CalService {
	void setValues(int x, int y);
	int calculate();
}

//클래스
class J16Cal implements J16CalService {
	private int x;
	private int y;
	
	public J16Cal() {
		
	}
//	멤버변수 x, y의 초기화 작업은
//	setValues메서드가 대신 하므로	
	
//	public J16Cal(int x, int y) {
//		
//		this.x = x;
//		this.y = y;
//		
//	}
	
	@Override
	public String toString() {
		return "J16Cal [ x = " + x + ", y = " + y + " ]";
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	@Override
	public void setValues(int x, int y) {
		this.x = x;
		this.y = y;
	}
	@Override
	public int calculate() {
		
		return 0;
	}
	
}

class J16Add extends J16Cal {
	
	@Override
	public int calculate() {
		
		return getX() + getY();
	}
}

class J16Mul extends J16Cal {
	@Override
	public int calculate() {
		
		return getX() * getY();
	}
}

class J16Sub extends J16Cal {
	@Override
	public int calculate() {
		
		return getX() - getY();
	}
}

class J16Div extends J16Cal {
	@Override
	public int calculate() {
		
		return getX() / getY();
	}
}

